﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//
//	virtual void Func1() 
//	{
//		cout << "Person::Func1()" << endl;
//	}
//
//	virtual void Func2() 
//	{
//		cout << "Person::Func2()" << endl;
//	}
//
////protected:
//	int _a = 0;
//};
//
//class Student : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-半价" << endl; }
//
//protected:
//	int _b = 1;
//};
//
//int main()
//{
//	Person ps;
//	Student st;
//	st._a = 10;
//
//	ps = st;
//	Person* ptr = &st;
//	Person& ref = st;
//	
//
//	return 0;
//}

class Person
{
protected:
	void Print()
	{
		cout << "name:" << _name << endl;
		cout << "age:" << _age << endl;
	}
protected:
	string _name = "peter"; // 姓名
	int _age = 18;  // 年龄
};
// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。这里体现出了
//Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象，可
//以看到变量的复用。调用Print可以看到成员函数的复用。
class Student : public Person
{
public:
	void test()
	{
		Print();
	}
protected:
	int _stuid=2022; // 学号
};

class Teacher : public Person
{
public:
	void test()
	{
		Print();
	}
protected:
	int _jobid=2026; // 工号
};
//int main()
//{
//	Student s;
//	Teacher t;
//	s.test();
//	t.test();
//	return 0;
//}

//int main()
//{
//	int i = 1;
//	double d = i;
//	const double& rd = i;
//}

//int main()
//{
//	string s("hello C++");
//	const string& st = "hello C++";
//}

//int main()
//{
//	Student s;
//	Person p;
//
//	Student st = p;
//	return 0;
//}

//int main()
//{
//	Student s;
//	Person p;
//
//	Person st = s;
//	return 0;
//}

//int main()
//{
//	Student s;
//	Person p;
//
//	Person& st = s;
//	return 0;
//}
//
//int main()
//{
//	Student s;
//	Person p=s;
//
//	Person* pp = &s;
//	Person& st = s;
//	return 0;
//}

//class Person
//{
//protected:
//	string _name; // 姓名
//	string _sex;  // 性别
//	int _age; // 年龄
//};
//class Student : public Person
//{
//public:
//	int _No; // 学号
//};
//void Test()
//{
//	Student sobj;
//	// 1.子类对象可以赋值给父类对象/指针/引用
//	Person pobj = sobj;
//	Person* pp = &sobj;
//	Person& rp = sobj;
//
//	//2.基类对象不能赋值给派生类对象
//	sobj = pobj;
//
//	// 3.基类的指针可以通过强制类型转换赋值给派生类的指针
//	pp = &sobj
//	Student * ps1 = (Student*)pp; // 这种情况转换时可以的。
//	ps1->_No = 10;
//
//	pp = &pobj;
//	Student* ps2 = (Student*)pp; // 这种情况转换时虽然可以，但是会存在越界访问的问题
//		ps2->_No = 10;
//}